# Title: numero mayor de una lista				Filename: primos.s
# Autho: Arturo Luquin Castillo           Date 08/03/2017
# Description: Numero maximo en una lista
# Input: -
# Output: Encontrar e Imprimir los Primeros 500 Numeros Primos


@@@@@@@@@@@
@Registros@
@@@@@@@@@@@

@r1 apunta a la direccion de primo
@r3 el numero actual
@r4 contador de primos
@r5 divisor actual
@r6 indice de divisores primos
@r7 residuo
@r8 cociente
@r9 numero de primos vistos

.section .bss
.comm prime, 2000       @ reserva espacio para los primos

.section  .data

spc:                    @separar los primos con 3 espacios
        .ascii"   "
len= . - spc

nl:
      .ascii "\n"       @renglon de separacion
      
 limit:               @indice del ultimo numero que necesitaremos.
      .long 500
 
 
 .section .text
 .globl _start
 _start:
 
 
 P1:
 ldr r1,=prime
 mov r0, $2
 str r0, [r1]
 ldr r0,=limit
 ldr r9,[r0]
 mov r3, $3
 mov r4, $1
 
 P2:
 add r4,r4,$1
 str r3,[r1, #4]!
 
 P3:
 cmp r4, r9
 bge P9
 
 P4:
 add r3,r3,$2
 
 P5:
 ldr r6,=prime
 ldr r5,[r6]
 mov r7, r3
 mov r8, $0
 
 
 P6: 
 cmp r7, r5
 subge r7,r7,r5
 addge r8,r8,$1
 cmp r7, $0
 beq P4
 
 
 P7:
 cmp r8,r5
 ble P2
 
 
 P8:
 cmp r7, r3
 mov r8,$0
 ldr r5,[r6,#4]!
 bal P6
 
 P9:
 mov r0,$1
 mov r4,$0
 mov r5,$0
 ldr r6,=prime
 ldr r3,[r6]
 
 printLoop:
 bl print_num
 add r4,$1
 add r5,$1
 cmp r5,r9
 bge exit
 cmp r4,$9
 bgt newline
 ble space
 
 space:
 mov r0,$1
 ldr r1,=spc
 ldr r2,=len
 mov r7,$4
 svc $0
 ldr r3,[r6,#4]!
 bal printloop
 
 newline:
 mov r0,$1
 ldr r1,=nl
 mov r2,$1
 mov r7,$4
 svc $0
 ldr r3,[r6,#4]!
 mov r4, $0
 bal printLoop
 
 
 
 
 @@@@@@@@@@@@@@@@@@@@
 @print_num function@
 @@@@@@@@@@@@@@@@@@@@
 
print num:
      stmfd sp!,{r0-r9, lr}
      mov r4, $0
      mov r5, $1
      
      
 loop:
    
      cmp r3, $9
      ble stackPush
      sub r3,r3,$10
      add r4,r4,$1
      bal loop
  
  stackPush
      
      add r5,r5,$1
      orr r0,r3,$0x30
      stmfd  sp!,{r0}
      beq printChars
      mov r3,r4
      mov r4,$0
      bal loop
      
     printChars:
     mov r1,sp
     mov r0,$1
     mov r2,$1
     mov r7,$4
     svc $0
     sub r5,r5,$1
     ble return
     ldmfd sp!,{r0}
     bal printChars
 return:
      ldmfd sp!,{r0-r9,pc}
  
  
  
exit:
mov r0,$1                       @ print a newline
ldr r1,=nl
mov r2,$1
mov r7,$4
svc $0
mov r7, $1                      @exit
svc $0

.end 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
